import { UserInfo } from '../api/type/user';
import { HttpStorage } from '../utils/http/HttpStorage';

export class UserModel {
  private static instance: UserModel;
  private _userInfo: UserInfo | null = null;
  private _isLoggedIn: boolean = false;

  private ad_count: number = 0;
  private today_ad_count: number = 0;


  private constructor() {}

  public static getInstance(): UserModel {
    if (!UserModel.instance) {
      UserModel.instance = new UserModel();
    }
    return UserModel.instance;
  }

  /**
   * 设置用户信息
   * @param userInfo 用户信息
   */
  public setUserInfo(userInfo: UserInfo): void {
    this._userInfo = userInfo;
    this._isLoggedIn = true;
    // 可以在这里添加本地存储逻辑，例如：
    try {
      localStorage.setItem('userInfo', JSON.stringify(userInfo));
    } catch (e) {
      console.error('保存用户信息失败:', e);
    }
  }

  /**
   * 存储code
   * @param code 微信登录返回的code
   */
  public setUserCode(code: string): void {
    if (!code) {
      console.error('code不能为空');
      return;
    }
    
    try {
      // 创建包含code和过期时间的对象
      const codeInfo = {
        code: code,
        expireTime: Date.now() + 7000 * 1000 // 当前时间 + 7000秒(毫秒单位)
      };
      
      // 存储到本地
      localStorage.setItem('wx_code', JSON.stringify(codeInfo));
      console.log('微信code已保存，有效期7000秒');
    } catch (e) {
      console.error('保存微信code失败:', e);
    }
  }

  /**
   * 获取code
   * @returns 有效的微信code或空字符串
   */
  public getUserCode(): string {
    try {
      // 从本地获取code信息
      const codeInfoStr = localStorage.getItem('wx_code');
      if (!codeInfoStr) {
        return '';
      }
      
      // 解析code信息
      const codeInfo = JSON.parse(codeInfoStr);
      
      // 检查过期时间
      if (Date.now() > codeInfo.expireTime) {
        // 已过期，清除存储并返回空字符串
        localStorage.removeItem('wx_code');
        console.log('微信code已过期');
        return '';
      }
      
      // 返回有效的code
      return codeInfo.code;
    } catch (e) {
      console.error('获取微信code失败:', e);
      return '';
    }
  }

  /**
   * 获取用户信息
   * @returns 用户信息
   */
  public getUserInfo(): UserInfo | null {
    if (!this._userInfo) {
      // 尝试从本地存储获取
      try {
        const storedInfo = localStorage.getItem('userInfo');
        if (storedInfo && storedInfo !== "null") {
          this._userInfo = JSON.parse(storedInfo);
          HttpStorage.set('token', this._userInfo.userInfo.token);
          this._isLoggedIn = true;
        } else {
          // 明确设置为未登录状态
          this._isLoggedIn = false;
        }
      } catch (e) {
        console.error('读取用户信息失败:', e);
        // 出错时也设置为未登录状态
        this._isLoggedIn = false;
      }
    }
    return this._userInfo;
  }

  /**
   * 清除用户信息（退出登录）
   */
  public clearUserInfo(): void {
    this._userInfo = null;
    this._isLoggedIn = false;
    try {
      localStorage.removeItem('userInfo');
      localStorage.removeItem('wx_code');
    } catch (e) {
      console.error('清除用户信息失败:', e);
    }
  }

  /**
   * 检查用户是否已登录
   * @returns 是否登录
   */
  public isLoggedIn(): boolean {
    if (!this._isLoggedIn) {
      // 检查本地存储
      this.getUserInfo();
    }
    console.log("登录状态检查结果:", this._isLoggedIn);
    return this._isLoggedIn;
  }

  /**
   * 获取用户令牌
   * @returns 用户令牌
   */
  public getToken(): string {
    return this._userInfo?.token || '';
  }

  /**
   * 获取用户昵称
   * @returns 用户昵称
   */
  public getNickname(): string {
    return this._userInfo?.nickname ?? '游客';
  }

  /**
   * 获取用户头像
   * @returns 用户头像URL
   */
  public getAvatar(): string {
    return this._userInfo?.avatar ?? '';
  }

  /**
   * 获取用户ID
   * @returns 用户ID
   */
  public getUserId(): number | null {
    return this._userInfo?.id || null;
  }

  /**
   * 获取用户广告次数
   * @returns 用户广告次数
   */
  public getAdCount(): number {
    return this.ad_count || 0;
  }

  /**
   * 获取用户今日广告次数
   * @returns 用户今日广告次数
   */
  public getTodayAdCount(): number {
    return this.today_ad_count || 0;
  }

  /**
   * 设置用户广告次数
   * @param ad_count 用户广告次数
   */
  public setAdCount(ad_count: number): void {
    this.ad_count = ad_count;
  }

  /**
   * 设置用户今日广告次数
   * @param today_ad_count 用户今日广告次数
   */
  public setTodayAdCount(today_ad_count: number): void {
    this.today_ad_count = today_ad_count;
  }


  // 增加用户广告次数
  public addAdCount(): void {
    this.ad_count++;
    this.today_ad_count++;
  }
  
  
}
